require("dotenv").config();
const express = require("express");
const path = require("path");
const fs = require("fs");
const bodyParser = require("body-parser");
const cors = require("cors");
const compression = require("compression");
const cookieParser = require("cookie-parser");
const { accessLog, errorLog, logger } = require("./utils/logger");

const redisMiddleware = require("./middlewares/redisMiddleware");
const { loadRoutesFromDirectory, welcome } = require("./utils/utils"); // 确保路径正确指向上面定义的中间件文件
const app = express();
if (process.env.NODE_ENV === "development") {
  // 自定义格式打印日志
  app.use(logger("dev"));
} else {
  // 生产环境
  app.use(accessLog());
  app.use(errorLog());
}
/**
 * Gzip 压缩可以大大减小响应主体的大小，从而提高 Web 应用的速度。
 * level 的范围是从 0 到 9，其中：
 * 0 表示无压缩，
 * 1 表示最快压缩，
 * 9 表示最佳压缩。
 */
app.use(compression({ level: 6 }));
/**
 * 导入并使用自定义的Redis中间件，该中间件负责在每个请求中初始化Redis服务
 */
app.use(redisMiddleware);

/**
 * 配置bodyParser中间件，用于解析请求体数据
 */
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

/**
 * 配置cookieParser中间件，用于解析请求中的Cookie数据
 */
app.use(cookieParser());

/**
 * 配置cors中间件，用于处理跨域请求
 */
app.use(cors());

/**
 * 配置静态资源目录，用于托管静态资源文件
 */
app.use("/public", express.static(path.join(__dirname, "public")));

/**
 * 使用函数加载路由文件
 */
loadRoutesFromDirectory(app, path.join(__dirname, "routes"), "/api");
welcome();
module.exports = app;
